home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / class / link.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  7KB  |  333 lines

  1.  
  2.  
  3. /*  Copyright (c) 1993-1996 Algorithms Corporation  */
  4. /*  All rights reserved.  */
  5.  
  6.  
  7.  
  8.  
  9. /*  This file automatically generated by dpp - do not edit  */
  10.  
  11. #define    DPP_STRATEGY    2
  12. #define    DPP_FASTWIDE    0
  13.  
  14.  
  15.  
  16.  
  17. #define    CLASS    Link_c
  18. #define    ivType    Link_iv_t
  19.  
  20. #include "generics.h"
  21.  
  22. object    Link_c;
  23.  
  24.  
  25. #line 26 "link.c"
  26. typedef struct  _Link_iv_t  {
  27.     object iPrev;
  28.     object iNext;
  29.     object iList;
  30. }    Link_iv_t;
  31.  
  32.  
  33.  
  34. #line 24 "link.d"
  35. imeth objrtn Link_im_gNext(object self)
  36. { Link_iv_t *iv = GetIVs(Link, self);
  37.     return iv->iNext == iv->iList ? NULLOBJ : iv->iNext; 
  38.  
  39. imeth objrtn Link_im_gPrevious(object self)
  40. { Link_iv_t *iv = GetIVs(Link, self);
  41.     return iv->iPrev == iv->iList ? NULLOBJ : iv->iPrev; 
  42.  
  43. imeth objrtn Link_im_gList(object self)
  44. { Link_iv_t *iv = GetIVs(Link, self);
  45.     return iv->iList; 
  46.  
  47. imeth objrtn Link_im_gChangeNext(object self, object next)
  48. { Link_iv_t *iv = GetIVs(Link, self);
  49.     ChkArgNul(next, 2); 
  50.     iv->iNext = next; 
  51.     return self; 
  52.  
  53. imeth objrtn Link_im_gChangePrevious(object self, object prev)
  54. { Link_iv_t *iv = GetIVs(Link, self);
  55.     ChkArgNul(prev, 2); 
  56.     iv->iPrev = prev; 
  57.     return self; 
  58.  
  59. imeth objrtn Link_im_gInitLink(object self, object list, object prev, object next)
  60. { Link_iv_t *iv = GetIVs(Link, self);
  61.     ChkArgNul(list, 2); 
  62.     ChkArgNul(prev, 3); 
  63.     ChkArgNul(next, 4); 
  64.     iv->iList = list; 
  65.     iv->iPrev = prev; 
  66.     iv->iNext = next; 
  67.     return self; 
  68.  
  69. imeth objrtn Remove(object self)
  70. { Link_iv_t *iv = GetIVs(Link, self);
  71. #ifdef NATIVE_THREADS 
  72.         if (iv->iList) 
  73.         gEnterCriticalSection(iv->iList); 
  74. #endif 
  75.         if (iv->iNext && iv->iNext != self) 
  76.         ivPtr(iv->iNext)->iPrev = iv->iPrev; 
  77.     if (iv->iPrev && iv->iPrev != self) 
  78.         ivPtr(iv->iPrev)->iNext = iv->iNext; 
  79.     if (iv->iList && iv->iList != self) 
  80.         gIncNelm(iv->iList, -1); 
  81.     iv->iList = iv->iNext = iv->iPrev = NULLOBJ; 
  82. #ifdef NATIVE_THREADS 
  83.         if (iv->iList) 
  84.         gLeaveCriticalSection(iv->iList); 
  85. #endif 
  86.         return self; 
  87.  
  88. imeth objrtn Link_im_gDispose(object self)
  89.     Remove(self); 
  90.     return oSuper(Link_c, gDispose, self)(self); 
  91.  
  92. imeth objrtn Link_im_gDeepDispose(object self)
  93.     Remove(self); 
  94.     return oSuper(Link_c, gDeepDispose, self)(self); 
  95.  
  96.  
  97.  
  98. imeth objrtn AddBefore(object self, object lnk)
  99. { Link_iv_t *iv = GetIVs(Link, self);
  100.     ivType *iv2; 
  101.  
  102.     ChkArg(lnk, 2); 
  103.     if (self == lnk) 
  104.         return self; 
  105. #ifdef NATIVE_THREADS 
  106.         if (iv->iList) 
  107.         gEnterCriticalSection(iv->iList); 
  108. #endif 
  109.         iv2 = ivPtr(lnk); 
  110.     if (iv2->iList || iv2->iNext || iv2->iPrev) 
  111.         gError(self, "Attempt to add a node to a list which is a member of another list."); 
  112.     if (iv2->iPrev = iv->iPrev) 
  113.         ivPtr(iv2->iPrev)->iNext = lnk; 
  114.     iv2->iNext = self; 
  115.     iv->iPrev = lnk; 
  116.     if (iv2->iList = iv->iList) 
  117.         gIncNelm(iv->iList, 1); 
  118. #ifdef NATIVE_THREADS 
  119.         if (iv->iList) 
  120.         gLeaveCriticalSection(iv->iList); 
  121. #endif 
  122.         return self; 
  123.  
  124.  
  125.  
  126. imeth objrtn AddAfter(object self, object lnk)
  127. { Link_iv_t *iv = GetIVs(Link, self);
  128.     ivType *iv2; 
  129.  
  130.     ChkArg(lnk, 2); 
  131.     if (self == lnk) 
  132.         return self; 
  133. #ifdef NATIVE_THREADS 
  134.         if (iv->iList) 
  135.         gEnterCriticalSection(iv->iList); 
  136. #endif 
  137.         iv2 = ivPtr(lnk); 
  138.     if (iv2->iList || iv2->iNext || iv2->iPrev) 
  139.         gError(self, "Attempt to add a node to a list which is a member of another list."); 
  140.     if (iv2->iNext = iv->iNext) 
  141.         ivPtr(iv2->iNext)->iPrev = lnk; 
  142.     iv2->iPrev = self; 
  143.     iv->iNext = lnk; 
  144.     if (iv2->iList = iv->iList) 
  145.         gIncNelm(iv->iList, 1); 
  146. #ifdef NATIVE_THREADS 
  147.         if (iv->iList) 
  148.         gLeaveCriticalSection(iv->iList); 
  149. #endif 
  150.         return self; 
  151.  
  152.  
  153.  
  154. imeth objrtn Link_im_gMoveBeginning(object self)
  155. { Link_iv_t *iv = GetIVs(Link, self);
  156.     ivType *iv2; 
  157.  
  158.     if (!iv->iList || self == iv->iList) 
  159.         return NULLOBJ; 
  160. #ifdef NATIVE_THREADS 
  161.         gEnterCriticalSection(iv->iList); 
  162. #endif 
  163.         iv2 = ivPtr(iv->iList); 
  164.     if (iv2->iNext == self) { 
  165. #ifdef NATIVE_THREADS 
  166.             gLeaveCriticalSection(iv->iList); 
  167. #endif 
  168.             return self; 
  169.     } 
  170.     Remove(self); 
  171.     AddAfter(iv->iList, self); 
  172. #ifdef NATIVE_THREADS 
  173.         gLeaveCriticalSection(iv->iList); 
  174. #endif 
  175.         return self; 
  176.  
  177.  
  178.  
  179. imeth objrtn Link_im_gMoveEnd(object self)
  180. { Link_iv_t *iv = GetIVs(Link, self);
  181.     ivType *iv2; 
  182.  
  183.     if (!iv->iList || self == iv->iList) 
  184.         return NULLOBJ; 
  185. #ifdef NATIVE_THREADS 
  186.         gEnterCriticalSection(iv->iList); 
  187. #endif 
  188.         iv2 = ivPtr(iv->iList); 
  189.     if (iv2->iPrev == self) { 
  190. #ifdef NATIVE_THREADS 
  191.             gLeaveCriticalSection(iv->iList); 
  192. #endif 
  193.             return self; 
  194.     } 
  195.     Remove(self); 
  196.     AddBefore(iv->iList, self); 
  197. #ifdef NATIVE_THREADS 
  198.         gLeaveCriticalSection(iv->iList); 
  199. #endif 
  200.         return self; 
  201.  
  202.  
  203.  
  204. imeth objrtn Link_im_gMoveAfter(object self, object lnk)
  205.     ChkArg(lnk, 2); 
  206.     Remove(self); 
  207.     AddAfter(lnk, self); 
  208.     return self; 
  209.  
  210.  
  211.  
  212. imeth objrtn Link_im_gMoveBefore(object self, object lnk)
  213.     ChkArg(lnk, 2); 
  214.     Remove(self); 
  215.     AddBefore(lnk, self); 
  216.     return self; 
  217.  
  218. imeth objrtn Link_im_gStringRepValue(object self)
  219. { Link_iv_t *iv = GetIVs(Link, self);
  220.     if (iv->iList && iv->iList == self) 
  221.         return oSuper(Link_c, gStringRepValue, self)(self); 
  222.     else 
  223.         return vSprintf(String, "(<%8.8lx>, <%8.8lx>)", iv->iPrev, iv->iNext); 
  224.  
  225. imeth objrtn Link_im_gStringRep(object self)
  226.     object s, t; 
  227.  
  228.     s = oSuper(Link_c, gStringRep, self)(self); 
  229.     t = gStringRepValue(self); 
  230.     vBuild(s, NULL, t, "\n", NULL); 
  231.     gDispose(t); 
  232.     return s; 
  233.  
  234. imeth objrtn Link_im_gCopy(object self)
  235.     object nobj; 
  236.     ivType *iv2; 
  237.  
  238.     nobj = oSuper(Link_c, gCopy, self)(self); 
  239.     iv2 = ivPtr(nobj); 
  240.     iv2->iList = iv2->iNext = iv2->iPrev = NULLOBJ; 
  241.     return nobj; 
  242.  
  243. imeth objrtn Link_im_gNth(object self, int idx)
  244.     while (idx > 0 && self) { 
  245.         self = gNext(self); 
  246.         idx--; 
  247.     } 
  248.     while (idx < 0 && self) { 
  249.         self = gPrevious(self); 
  250.         idx++; 
  251.     } 
  252.     return idx ? NULLOBJ : self; 
  253.  
  254.  
  255. #line 282 "link.c"
  256.  
  257. objrtn    Link_initialize(void)
  258. {
  259.     static  CRITICALSECTION  cs;
  260.     static  int volatile once = 0;
  261.  
  262.     ENTERCRITICALSECTION(_CI_CS_);
  263.     if (!once) {
  264.         INITIALIZECRITICALSECTION(cs);
  265.         once = 1;
  266.     }
  267.     LEAVECRITICALSECTION(_CI_CS_);
  268.  
  269.     ENTERCRITICALSECTION(cs);
  270.  
  271.     if (Link_c) {
  272.         LEAVECRITICALSECTION(cs);
  273.         return Link_c;
  274.     }
  275.     INHIBIT_THREADER;
  276.     Link_c = gNewClass(Class, "Link", sizeof(Link_iv_t), 0, END);
  277.     iMethodFor(Link, gAddAfter, AddAfter);
  278.     iMethodFor(Link, gInitLink, Link_im_gInitLink);
  279.     iMethodFor(Link, gRemove, Remove);
  280.     iMethodFor(Link, gMoveBeginning, Link_im_gMoveBeginning);
  281.     iMethodFor(Link, gChangeNext, Link_im_gChangeNext);
  282.     iMethodFor(Link, gMoveAfter, Link_im_gMoveAfter);
  283.     iMethodFor(Link, gList, Link_im_gList);
  284.     iMethodFor(Link, gNext, Link_im_gNext);
  285.     iMethodFor(Link, gAddBefore, AddBefore);
  286.     iMethodFor(Link, gDispose, Link_im_gDispose);
  287.     iMethodFor(Link, gChangePrevious, Link_im_gChangePrevious);
  288.     iMethodFor(Link, gMoveBefore, Link_im_gMoveBefore);
  289.     iMethodFor(Link, gMoveEnd, Link_im_gMoveEnd);
  290.     iMethodFor(Link, gStringRepValue, Link_im_gStringRepValue);
  291.     iMethodFor(Link, gPrevious, Link_im_gPrevious);
  292.     iMethodFor(Link, gCopy, Link_im_gCopy);
  293.     iMethodFor(Link, gDeepDispose, Link_im_gDeepDispose);
  294.     iMethodFor(Link, gStringRep, Link_im_gStringRep);
  295.     iMethodFor(Link, gDeepCopy, Link_im_gCopy);
  296.     iMethodFor(Link, gNth, Link_im_gNth);
  297.  
  298.     ENABLE_THREADER;
  299.  
  300.     LEAVECRITICALSECTION(cs);
  301.  
  302.     return Link_c;
  303. }
  304.  
  305.  
  306.  
  307.